package cn.xumaoyang.pay.service.impl;
import cn.xumaoyang.basic.exception.BusinessException;
import cn.xumaoyang.basic.service.impl.BaseServiceImpl;
import cn.xumaoyang.order.domain.AdoptOrder;
import cn.xumaoyang.order.service.IProductOrderService;
import cn.xumaoyang.pay.constants.PayConstants;
import cn.xumaoyang.pay.domain.AlipayInfo;
import cn.xumaoyang.pay.domain.PayBill;
import cn.xumaoyang.pay.mapper.AlipayInfoMapper;
import cn.xumaoyang.pay.mapper.PayBillMapper;
import cn.xumaoyang.pay.service.IPayBillService;
import cn.xumaoyang.pay.utils.AlipayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PayBillServiceImpl extends BaseServiceImpl<PayBill> implements IPayBillService {

    @Autowired
    private AlipayInfoMapper alipayInfoMapper;

    @Autowired
    private PayBillMapper payBillMapper;

    @Autowired
    private IProductOrderService productOrderService;






    /**
     * 统一支付接口，
     *
     *
     *   order 订单。
     *
     *   payMethod 支付方式。
     */

    @Override
    public String pay(Object order, Long payMethod) {
        //第一步，校验不能传递空参数进来。
        if (order == null || payMethod == null){
            throw new BusinessException("请输入必要参数");
        }
        //第二步判断是那种订单。instanceof可以理解为等于这种类型。
        //获取订单的实体类。
        PayBill payBill = new PayBill();
        if (order instanceof AdoptOrder){
            //如果等于，则把order强转为AdoptOrder类型的order。
            AdoptOrder adoptOrder = (AdoptOrder)order;
            //设值。
            payBill.setDigest(adoptOrder.getDigest());//内容。
            payBill.setMoney(adoptOrder.getPrice());//钱。
            payBill.setUnionPaySn(adoptOrder.getPaySn());//订单号。前面已经使用工具类设置好了。
            payBill.setLastPayTime(adoptOrder.getLastPayTime()); //下单时间。
            payBill.setPayChannel(payMethod);//支付方式。
            payBill.setBusinessType(PayConstants.BUSINESS_YPE_ADOPT_ORDER);//使用了一个常量类。
            payBill.setBusinessKey(adoptOrder.getId());
            payBill.setUser_id(adoptOrder.getUser_id());
            payBill.setShop_id(adoptOrder.getShop_id());
        }
        //保存。生成了支付单。
        payBillMapper.add(payBill);
        //调支付宝支付，支付宝支付设置为1。
        if (payMethod == 1){
            AlipayInfo info = alipayInfoMapper.loadByShopId(payBill.getShop_id());
            return AlipayUtils.pay(info,payBill);
        }
        return null;
    }

    @Override
    public PayBill loadByUnionPaySn(String unionPaySn) {
        return payBillMapper.loadByUnionPaySn(unionPaySn);
    }


}
